import axios from 'axios'
import { useAuthStore } from '@/stores/auth'
import router from '@/router'

// 创建 axios 实例
const http = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8080/api',
  timeout: 15000,
  headers: {
    'Content-Type': 'application/json',
  },
})

// 请求拦截器：添加 token
http.interceptors.request.use(
  (config) => {
    const authStore = useAuthStore()
    if (authStore.token) {
      config.headers.Authorization = `Bearer ${authStore.token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  },
)

// 响应拦截器：统一处理错误
http.interceptors.response.use(
  (response) => {
    return response.data
  },
  (error) => {
    // 处理 HTTP 错误
    if (error.response) {
      const { status, data, config } = error.response

      // 401 未授权
      if (status === 401) {
        // 如果是登录接口返回401，说明用户名或密码错误
        if (config.url && config.url.includes('/auth/login')) {
          return Promise.reject(new Error('用户名或密码错误'))
        }

        // 其他接口返回401，说明token过期
        const authStore = useAuthStore()
        authStore.logout()
        router.push('/login')
        return Promise.reject(new Error('登录已过期，请重新登录'))
      }

      // 返回后端错误信息
      const message = data?.message || `请求失败 (${status})`
      return Promise.reject(new Error(message))
    }

    // 网络错误
    if (error.code === 'ECONNABORTED') {
      return Promise.reject(new Error('请求超时，请稍后再试'))
    }

    if (!error.response) {
      return Promise.reject(new Error('网络错误，请检查网络连接'))
    }

    return Promise.reject(error)
  },
)

export default http
